home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI2 / LEZIONE6g.s < prev    next >
Text File  |  1994-07-10  |  9KB  |  267 lines

  1.  
  2. ; Lezione6g.s        SCRITTURA "SOPRA" UNA FIGURA (in trasparenza)
  3. ;            Tasto sinistro del mouse per avanzare, destro per
  4. ;            retrocedere, entrambi per uscire - si puo' scorrere
  5. ;            anche tutta la memoria come in Lezione5l.s
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase in a6
  11.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  12.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist vecchia
  17.  
  18. ;    Puntiamo i bitplanes in copperlist - prima la PIC
  19.  
  20.     MOVE.L    #PIC,d0        ; in d0 mettiamo l'indirizzo della PIC, in
  21.                 ; questo caso puntiamo piu' avanti di 50
  22.                 ; linee in modo da far "SALIRE" l'immagine.
  23.     LEA    BPLPOINTERS,A1    ; puntatori nella COPPERLIST
  24.     MOVEQ    #2,D1        ; numero di bitplanes -1 (qua sono 3)
  25. POINTBP:
  26.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  27.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  28.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  29.     swap    d0        ; scambia le 2 word di d0 (es: 3412 > 1234)
  30.     ADD.L    #40*256,d0    ; + lunghezza bitplane -> prossimo bitplane
  31.     addq.w    #8,a1        ; andiamo ai prossimi bplpointers nella COP
  32.     dbra    d1,POINTBP    ; Rifai D1 volte POINTBP (D1=num of bitplanes)
  33.  
  34. ;     PUNTIAMO IL NOSTRO BITPLANE
  35.  
  36.     MOVE.L    #BITPLANE,d0    ; in d0 mettiamo l'indirizzo della PIC,
  37.     LEA    BPLPOINTERS2,A1    ; puntatori nella COPPERLIST (plane 4!)
  38.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  39.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  40.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  41.  
  42.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  43.     move.w    d0,$dff088        ; Facciamo partire la COP
  44.     move.w    #0,$dff1fc        ; Disattiva l'AGA
  45.     move.w    #$c00,$dff106        ; Disattiva l'AGA
  46.  
  47.     bsr.w    print        ; Stampa le linee di testo sullo schermo
  48.                 ; in HIRES
  49.  
  50. mouse:
  51.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  52.     bne.s    mouse        ; Se non ancora, non andare avanti
  53. Aspetta:
  54.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  55.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta!
  56.  
  57.     btst    #2,$dff016    ; se il tasto destro e' premuto
  58.     bne.s    NonGiu        ; scorri giu!, oppure vai a NonGiu
  59.  
  60.     bsr.w    VaiGiu        ; tasto destro premuto, scorri giu!
  61.  
  62. Nongiu:
  63.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  64.     beq.s    Scorrisu    ; se si, scorri in su
  65.     bra.s    mouse        ; no? allora ripeti il ciclo il prossimo FRAME
  66.  
  67. Scorrisu:
  68.     bsr.w    VaiSu        ; fa scorrere la figura in alto
  69.  
  70.     btst    #2,$dff016    ; se anche il tasto destro e' premuto allora
  71.     bne.s    mouse        ; sono premuti entrambi, esci, oppure "MOUSE"
  72.  
  73.  
  74.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  75.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  76.  
  77.     move.l    4.w,a6
  78.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  79.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  80.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  81.     rts            ; USCITA DAL PROGRAMMA
  82.  
  83. ;    Dati
  84.  
  85. GfxName:
  86.     dc.b    "graphics.library",0,0
  87.  
  88. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  89.     dc.l    0    ; della graphics.library
  90.  
  91. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  92.     dc.l    0
  93.  
  94. ;    Routine che stampa caratteri larghi 8x8 pixel (su schermo LOWRES)
  95.  
  96. PRINT:
  97.     LEA    TESTO(PC),A0    ; Indirizzo del testo da stampare in a0
  98.     LEA    BITPLANE,A3    ; Indirizzo del bitplane destinazione in a3
  99.     MOVEQ    #23-1,D3    ; NUMERO RIGHE DA STAMPARE: 23
  100. PRINTRIGA:
  101.     MOVEQ    #40-1,D0    ; NUMERO COLONNE PER RIGA: 40 (lores)
  102. PRINTCHAR2:
  103.     MOVEQ    #0,D2        ; Pulisci d2
  104.     MOVE.B    (A0)+,D2    ; Prossimo carattere in d2
  105.     SUB.B    #$20,D2        ; TOGLI 32 AL VALORE ASCII DEL CARATTERE, IN
  106.                 ; MODO DA TRASFORMARE, AD ESEMPIO, QUELLO
  107.                 ; DELLO SPAZIO (che e' $20), in $00, quello
  108.                 ; DELL'ASTERISCO ($21), in $01...
  109.     MULU.W    #8,D2        ; MOLTIPLICA PER 8 IL NUMERO PRECEDENTE,
  110.                 ; essendo i caratteri alti 8 pixel
  111.     MOVE.L    D2,A2
  112.     ADD.L    #FONT,A2    ; TROVA IL CARATTERE DESIDERATO NEL FONT...
  113.  
  114.                 ; STAMPIAMO IL CARATTERE LINEA PER LINEA
  115.     MOVE.B    (A2)+,(A3)    ; stampa LA LINEA 1 del carattere
  116.     MOVE.B    (A2)+,40(A3)    ; stampa LA LINEA 2  " "
  117.     MOVE.B    (A2)+,40*2(A3)    ; stampa LA LINEA 3  " "
  118.     MOVE.B    (A2)+,40*3(A3)    ; stampa LA LINEA 4  " "
  119.     MOVE.B    (A2)+,40*4(A3)    ; stampa LA LINEA 5  " "
  120.     MOVE.B    (A2)+,40*5(A3)    ; stampa LA LINEA 6  " "
  121.     MOVE.B    (A2)+,40*6(A3)    ; stampa LA LINEA 7  " "
  122.     MOVE.B    (A2)+,40*7(A3)    ; stampa LA LINEA 8  " "
  123.  
  124.     ADDQ.w    #1,A3        ; A1+1, avanziamo di 8 bit (PROSSIMO CARATTERE)
  125.  
  126.     DBRA    D0,PRINTCHAR2    ; STAMPIAMO D0 (40) CARATTERI PER RIGA
  127.  
  128.     ADD.W    #40*7,A3    ; ANDIAMO A CAPO
  129.  
  130.     DBRA    D3,PRINTRIGA    ; FACCIAMO D3 RIGHE
  131.  
  132.     RTS
  133.  
  134.  
  135.         ; numero caratteri per linea: 40
  136. TESTO:         ;          1111111111222222222233333333334
  137.          ;     1234567890123456789012345678901234567890
  138.     dc.b    '                                        ' ; 1
  139.     dc.b    '                SECONDA RIGA            ' ; 2
  140.     dc.b    '     /\  /                              ' ; 3
  141.     dc.b    '    /  \/                               ' ; 4
  142.     dc.b    '                                        ' ; 5
  143.     dc.b    '        SESTA RIGA                      ' ; 6
  144.     dc.b    '                                        ' ; 7
  145.     dc.b    '                                        ' ; 8
  146.     dc.b    'FABIO CIUCCI COMMUNICATION INTERNATIONAL' ; 9
  147.     dc.b    '                                        ' ; 10
  148.     dc.b    '   1234567890 !@#$%^&*()_+|\=-[]{}      ' ; 11
  149.     dc.b    '                                        ' ; 12
  150.     dc.b    ' -=- LA PALINGENETICA OBLITERAZIONE -=- ' ; 13
  151.     dc.b    " ##  DELL'IO TRASCENDENTALE CHE SI  ##  " ; 14
  152.     dc.b    ' ///    IMMEDESIMA E SI INFUTURA   \\\  ' ; 15
  153.     dc.b    '  Nel mezzo del cammin di nostra vita   ' ; 16
  154.     dc.b    '                                        ' ; 17
  155.     dc.b    '    Mi RitRoVaI pEr UnA sELva oScuRa    ' ; 18
  156.     dc.b    '                                        ' ; 19
  157.     dc.b    '    CHE LA DIRITTA VIA ERA SMARRITA     ' ; 20
  158.     dc.b    '                                        ' ; 21
  159.     dc.b    '  AHI Quanto a DIR QUAL ERA...          ' ; 22
  160.     dc.b    '                                        ' ; 23
  161.     dc.b    '                                        ' ; 24
  162.     dc.b    '                                        ' ; 25
  163.     dc.b    '                                        ' ; 26
  164.  
  165.     EVEN
  166.  
  167. ;    Questa routine sposta la figura in alto e in basso, agendo sui
  168. ;    puntatori ai bitplanes in copperlist (tramite la label BPLPOINTERS)
  169. ;    Da Lezione5l.s
  170.  
  171. VAIGIU:
  172.     LEA    BPLPOINTERS2,A1    ; Con queste 4 istruzioni preleviamo dalla
  173.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  174.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  175.     move.w    6(a1),d0    ; in d0 - il contrario della routine che
  176.     sub.l    #40,d0        ; sottraiamo 40, ossia 1 linea, facendo
  177.                 ; scorrere in BASSO la figura
  178.     bra.s    Finito
  179.  
  180.  
  181. VAISU:
  182.     LEA    BPLPOINTERS2,A1    ; Con queste 4 istruzioni preleviamo dalla
  183.     move.w    2(a1),d0    ; copperlist l'indirizzo dove sta puntando
  184.     swap    d0        ; attualmente il $dff0e0 e lo poniamo
  185.     move.w    6(a1),d0    ; in d0 - il contrario della routine che
  186.     add.l    #40,d0        ; Aggiungiamo 40, ossia 1 linea, facendo
  187.                 ; scorrere in ALTO la figura
  188.     bra.w    finito
  189.  
  190.  
  191. Finito:                ; PUNTIAMO I PUNTATORI BITPLANES
  192.     move.w    d0,6(a1)    ; copia la word BASSA dell'indirizzo del plane
  193.     swap    d0        ; scambia le 2 word di d0 (es: 1234 > 3412)
  194.     move.w    d0,2(a1)    ; copia la word ALTA dell'indirizzo del plane
  195.     rts
  196.  
  197.  
  198.  
  199.     SECTION    GRAPHIC,DATA_C
  200.  
  201. COPPERLIST:
  202.     dc.w    $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
  203.     dc.w    $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
  204.     dc.w    $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
  205.     dc.w    $13e,$0000
  206.  
  207.     dc.w    $8e,$2c81    ; DiwStrt    (registri con valori normali)
  208.     dc.w    $90,$2cc1    ; DiwStop
  209.     dc.w    $92,$0038    ; DdfStart
  210.     dc.w    $94,$00d0    ; DdfStop
  211.     dc.w    $102,0        ; BplCon1
  212.     dc.w    $104,0        ; BplCon2
  213.     dc.w    $108,0        ; Bpl1Mod
  214.     dc.w    $10a,0        ; Bpl2Mod
  215.  
  216.             ; 5432109876543210
  217.     dc.w    $100,%0100001000000000    ; bit 14 - 4 bitplanes, 16 colori
  218.  
  219. BPLPOINTERS:
  220.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  221.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  222.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  223. BPLPOINTERS2:
  224.     dc.w $ec,$0000,$ee,$0000    ;quarto     bitplane
  225.  
  226.     dc.w    $180,$000    ; color0 ; colori della figura un po' attenuati
  227.     dc.w    $182,$354    ; color1
  228.     dc.w    $184,$678    ; color2
  229.     dc.w    $186,$567    ; color3
  230.     dc.w    $188,$455    ; color4
  231.     dc.w    $18a,$121    ; color5
  232.     dc.w    $18c,$455    ; color6
  233.     dc.w    $18e,$233    ; color7
  234.  
  235.     dc.w    $190,$454    ; color8    ; I colori della scritta:
  236.     dc.w    $192,$7a8    ; color9    ; in questo caso formiamo
  237.     dc.w    $194,$eef    ; color10    ; 8 diversi colori per le
  238.     dc.w    $196,$cde    ; color11    ; 8 possibilita' di
  239.     dc.w    $198,$aab    ; color12    ; sovrapposizione - se notate
  240.     dc.w    $19a,$786    ; color13    ; sono simili ai primi 8,
  241.     dc.w    $19c,$9aa    ; color14    ; ma molto piu' luminosi
  242.     dc.w    $19e,$789    ; color15    ; per creare la "TRASPARENZA"
  243.  
  244.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  245.  
  246. ;    Il FONT caratteri 8x8
  247.  
  248. FONT:
  249.     incbin    "metal.fnt"    ; Carattere largo
  250. ;    incbin    "normal.fnt"    ; Simile ai caratteri kickstart 1.3
  251. ;    incbin    "nice.fnt"    ; Carattere stretto
  252.  
  253. PIC:
  254.     incbin    "amiga.320*256*3"    ; qua carichiamo la figura in RAW,
  255.  
  256.     SECTION    MIOPLANE,BSS_C    ; in CHIP
  257.  
  258. BITPLANE:
  259.     ds.b    40*256    ; un bitplane lores 320x256
  260.  
  261.     end
  262.  
  263. Potete scorrere anche tutta la memoria sopra la figura! Se indietreggiate col
  264. tasto destro del mouse troverete i 3 bitplanes della figura, poi il font
  265. caratteri (non ben visibile per l'incongruenza di modulo) eccetera.
  266.  
  267.